home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Newswatcher 2.0b22 / NW Source / Source / ic.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-07  |  23.1 KB  |  711 lines  |  [TEXT/MMCC]

  1. /*----------------------------------------------------------------------------
  2.  
  3.     ic.c
  4.     
  5.     This module encapsulates the interface to the Internet Config system.
  6.     
  7.     Copyright © 1994, Northwestern University.
  8.  
  9. ----------------------------------------------------------------------------*/
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <GestaltEqu.h>
  14. #include "glob.h"
  15. #include "ic.h"
  16. #include "ICTypes.h"
  17. #include "ICAPI.h"
  18. #include "strutil.h"
  19. #include "fileutil.h"
  20. #include "memutil.h"
  21. #include "apputil.h"
  22.  
  23.  
  24.  
  25. static ICInstance gInst;
  26. static Boolean gICStartOK = false;
  27.  
  28.  
  29.  
  30. /*----------------------------------------------------------------------------
  31.     MyICGetPref
  32.     
  33.     Get a preference from IC. Same parameters as ICGetPref.
  34. ----------------------------------------------------------------------------*/
  35.  
  36. static pascal ICError MyICGetPref (ICInstance inst, ConstStr255Param key, 
  37.     ICAttr *attr, Ptr buf, long *size)
  38. {
  39.     Str255 keyCopy;        /* word-aligned to avoid crashes on 68000 Macs */
  40.     
  41.     CopyPascalString(keyCopy, (StringPtr)key);
  42.     return ICGetPref(inst, keyCopy, attr, buf, size);
  43. }
  44.  
  45.  
  46.  
  47. /*----------------------------------------------------------------------------
  48.     MyICSetPref
  49.     
  50.     Set a preference to IC. Same parameters as ICSetPref.
  51. ----------------------------------------------------------------------------*/
  52.  
  53. static pascal ICError MyICSetPref (ICInstance inst, ConstStr255Param key, 
  54.     ICAttr attr, Ptr buf, long size)
  55. {
  56.     Str255 keyCopy;        /* word-aligned to avoid crashes on 68000 Macs */
  57.     
  58.     CopyPascalString(keyCopy, (StringPtr)key);
  59.     return ICSetPref(inst, keyCopy, attr, buf, size);
  60. }
  61.  
  62.  
  63.  
  64. /*----------------------------------------------------------------------------
  65.     MyICStart 
  66.     
  67.     Start Internet Config.
  68.     
  69.     Entry:    prefsFileLocated = true if we have found a NewsWatcher Prefs file, 
  70.                 in which case the vRefNum and dirID params are valid, 
  71.                 and we tell Internet Config to search the same folder.
  72.             vRefNum = vol ref num of NewsWatcher Prefs file.
  73.             dirID = dir id of NewsWatcher Prefs file.
  74.             
  75.     This function must be called after locating and reading NewsWatcher's 
  76.     prefs file.
  77. ----------------------------------------------------------------------------*/
  78.  
  79. void MyICStart (Boolean prefsFileLocated, short vRefNum, long dirID)
  80. {
  81.     ICError icErr, icErrCountPref;
  82.     ICDirSpecArray    dirSpecArray;
  83.     long count;
  84.     
  85.     if (gICStartOK) return;
  86.     icErr = ICStart(&gInst, kNewsWatcherSignature);
  87.     if (icErr != noErr) return;
  88.     if (prefsFileLocated) {
  89.         dirSpecArray[0].vRefNum = vRefNum;
  90.         dirSpecArray[0].dirID = dirID;
  91.         icErr = ICFindConfigFile(gInst, 1, &dirSpecArray);
  92.     } else {
  93.         icErr = ICFindConfigFile(gInst, 0, nil);
  94.     }
  95.     if (icErr != noErr) return;
  96.     icErr = ICBegin(gInst, icReadOnlyPerm);
  97.     if (icErr != noErr) return;
  98.     icErrCountPref = ICCountPref(gInst, &count);
  99.     icErr = ICEnd(gInst);
  100.     if (icErr != noErr) return;
  101.     gICStartOK = icErrCountPref == noErr && count > 0;
  102. }
  103.  
  104.  
  105.  
  106. /*----------------------------------------------------------------------------
  107.     MyICStop 
  108.     
  109.     Stop Internet Config.
  110. ----------------------------------------------------------------------------*/
  111.  
  112. void MyICStop (void)
  113. {
  114.     if (gICStartOK) ICStop(gInst);
  115.     gInst = nil;
  116.     gICStartOK = false;
  117. }
  118.  
  119.  
  120.  
  121. /*----------------------------------------------------------------------------
  122.     ReadCStringFromPString 
  123.     
  124.     Read a C string shared pref from a P string IC pref.
  125.     
  126.     Entry:    maxSize = max size of theString.
  127.             key = IC keyword.
  128.             
  129.     Exit:    theString = pref string as read from IC.
  130. ----------------------------------------------------------------------------*/
  131.  
  132. static void ReadCStringFromPString (char *theString, long maxSize, 
  133.     ConstStr255Param key)
  134. {
  135.     CStr255 str;
  136.     ICError icErr;
  137.     ICAttr attr;
  138.     
  139.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)str, &maxSize);
  140.     if (icErr == noErr) {
  141.         p2cstr((StringPtr)str);
  142.         strcpy(theString, str);
  143.     }
  144. }
  145.  
  146.  
  147.  
  148. /*----------------------------------------------------------------------------
  149.     ReadPStringFromPString 
  150.     
  151.     Read a P string shared pref from a P string IC pref.
  152.     
  153.     Entry:    maxSize = max size of theString.
  154.             key = IC keyword.
  155.             
  156.     Exit:    theString = pref string as read from IC.
  157. ----------------------------------------------------------------------------*/
  158.  
  159. static void ReadPStringFromPString (StringPtr theString, long maxSize, 
  160.     ConstStr255Param key)
  161. {
  162.     Str255 str;
  163.     ICError icErr;
  164.     ICAttr attr;
  165.     
  166.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)str, &maxSize);
  167.     if (icErr == noErr) 
  168.         CopyPascalString(theString, str);
  169. }
  170.  
  171.  
  172.  
  173. /*----------------------------------------------------------------------------
  174.     ReadCStringFromText 
  175.     
  176.     Read a C string shared pref from a text IC pref.
  177.     
  178.     Entry:    maxSize = max size of theString.
  179.             key = IC keyword.
  180.             
  181.     Exit:    theString = pref string as read from IC.
  182. ----------------------------------------------------------------------------*/
  183.  
  184. static void ReadCStringFromText (char *theString, long maxSize, 
  185.     ConstStr255Param key)
  186. {
  187.     char buf[4096];
  188.     ICError icErr;
  189.     ICAttr attr;
  190.     long size;
  191.     
  192.     size = maxSize - 1;
  193.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)buf, &size);
  194.     if (icErr == noErr) {
  195.         BlockMoveData(buf, theString, size);
  196.         theString[size] = 0;
  197.     }
  198. }
  199.  
  200.  
  201.  
  202. /*----------------------------------------------------------------------------
  203.     ReadFolderFromFileSpec 
  204.     
  205.     Read a default folder shared pref from an ICFileSpec IC pref.
  206.     
  207.     Entry:    key = IC keyword.
  208.             
  209.     Exit:    *defaultFolder = true if pref read OK.
  210.             *defaultFolderAlias = handle to default folder alias.
  211. ----------------------------------------------------------------------------*/
  212.  
  213. static void ReadFolderFromFileSpec (Boolean *defaultFolder, 
  214.     AliasHandle *defaultFolderAlias, 
  215.     ConstStr255Param key)
  216. {
  217.     char buf[4096];
  218.     ICError icErr;
  219.     ICAttr attr;
  220.     long size;
  221.     ICFileSpec *p;
  222.     AliasHandle alias;
  223.     OSErr err = noErr;
  224.     
  225.     size = sizeof(buf);
  226.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)buf, &size);
  227.     if (icErr == noErr) {
  228.         p = (ICFileSpec*)buf;
  229.         if (p->alias.aliasSize == 0) {
  230.             err = VolNameAndCreationDateToVRefNum(p->vol_name, p->vol_creation_date,
  231.                 &p->fss.vRefNum);
  232.             if (err != noErr) return;
  233.             err = NewAlias(nil, &p->fss, &alias);
  234.             if (err != noErr) return;
  235.         } else {
  236.             err = MyNewHandle(p->alias.aliasSize, &alias);
  237.             if (err != noErr) return;
  238.             BlockMoveData(&p->alias, *alias, p->alias.aliasSize);
  239.         }
  240.         MyDisposeHandle(*defaultFolderAlias);
  241.         *defaultFolderAlias = alias;
  242.         *defaultFolder = true;
  243.     }
  244. }
  245.  
  246.  
  247.  
  248. /*----------------------------------------------------------------------------
  249.     ReadFontInfo 
  250.     
  251.     Read font info from an ICFontRecord IC pref.
  252.     
  253.     Entry:    key = IC keyword.
  254.             
  255.     Exit:    fontName = font name as read from IC.
  256.             *fontSize = font size as read from IC.
  257. ----------------------------------------------------------------------------*/
  258.  
  259. static void ReadFontInfo (Str255 fontName, short *fontSize, 
  260.     ConstStr255Param key)
  261. {
  262.     ICError icErr;
  263.     ICFontRecord icFontRecord;
  264.     ICAttr attr;
  265.     long size;
  266.  
  267.     size = sizeof(icFontRecord);
  268.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)&icFontRecord, &size);
  269.     if (icErr == noErr) {
  270.         CopyPascalString(fontName, icFontRecord.font);
  271.         *fontSize = icFontRecord.size;
  272.     }
  273. }
  274.  
  275.  
  276.  
  277. /*----------------------------------------------------------------------------
  278.     ReadURLHelperInfo 
  279.     
  280.     Read URL Helper info from an ICAppSpec IC pref.
  281.     
  282.     Entry:    key = IC keyword.
  283.             
  284.     Exit:    *helperInfo = helper info.
  285. ----------------------------------------------------------------------------*/
  286.  
  287. static void ReadURLHelperInfo (TURLHelperInfo *helperInfo, ConstStr255Param key)
  288. {
  289.     ICError icErr;
  290.     ICAppSpec icAppSpec;
  291.     ICAttr attr;
  292.     long size;
  293.     
  294.     size = sizeof(icAppSpec);
  295.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)&icAppSpec, &size);
  296.     if (icErr == noErr && helperInfo->sig != icAppSpec.fCreator) {
  297.         helperInfo->sig = icAppSpec.fCreator;
  298.         helperInfo->versionNumber = 0;
  299.         helperInfo->lastMod = 0;
  300.     }    
  301. }
  302.  
  303.  
  304.  
  305. /*----------------------------------------------------------------------------
  306.     ReadEditorInfo 
  307.     
  308.     Read text editor info from an ICAppSpec IC pref.
  309.             
  310.     Exit:    *sig = signature of editor applicaton.
  311. ----------------------------------------------------------------------------*/
  312.  
  313. static void ReadEditorInfo (OSType *sig)
  314. {
  315.     ICError icErr;
  316.     ICAppSpec icAppSpec;
  317.     ICAttr attr;
  318.     long size;
  319.     
  320.     size = sizeof(icAppSpec);
  321.     icErr = MyICGetPref(gInst, kICeditorHelper, &attr, (Ptr)&icAppSpec, &size);
  322.     if (icErr == noErr) *sig = icAppSpec.fCreator;
  323. }
  324.  
  325.  
  326.  
  327. /*----------------------------------------------------------------------------
  328.     MyICReadSharedPrefs 
  329.     
  330.     Read shared Internet Config prefs.
  331.     
  332.     Entry:    key = IC keyword for shared pref.
  333. ----------------------------------------------------------------------------*/
  334.  
  335. void MyICReadSharedPrefs (ConstStr255Param key)
  336. {
  337.     ICError icErr;
  338.  
  339.     if (!gICStartOK) return;
  340.     
  341.     icErr = ICBegin(gInst, icReadOnlyPerm);
  342.     if (icErr != noErr) return;
  343.     
  344.     if (EqualString(key, kICAllSharedPrefs, true, true)) {
  345.         ReadCStringFromPString(gPrefs.fullName, sizeof(gPrefs.fullName), 
  346.             kICRealName);
  347.         ReadCStringFromPString(gPrefs.organization, sizeof(gPrefs.organization),
  348.             kICOrganization);
  349.         ReadCStringFromPString(gPrefs.quoteString, sizeof(gPrefs.quoteString),
  350.             kICQuotingString);
  351.         ReadCStringFromText(gPrefs.signature, sizeof(gPrefs.signature),
  352.             kICSignature);
  353.         ReadCStringFromPString(gPrefs.emailAddress, sizeof(gPrefs.emailAddress),
  354.             kICEmail);
  355.         ReadPStringFromPString(gPrefs.mailServerName, sizeof(gPrefs.mailServerName),
  356.             kICSMTPHost);
  357.         ReadCStringFromText(gPrefs.extraMailHdrLines, sizeof(gPrefs.extraMailHdrLines),
  358.             kICMailHeaders);
  359.         ReadCStringFromPString(gPrefs.authUsername, sizeof(gPrefs.authUsername),
  360.             kICNewsAuthUsername);
  361.         ReadCStringFromPString(gPrefs.authPassword, sizeof(gPrefs.authPassword),
  362.             kICNewsAuthPassword);
  363.         ReadPStringFromPString(gPrefs.newsServerName, sizeof(gPrefs.newsServerName),
  364.             kICNNTPHost);
  365.         ReadCStringFromText(gPrefs.extraNewsHdrLines, sizeof(gPrefs.extraNewsHdrLines),
  366.             kICNewsHeaders);
  367.         ReadFolderFromFileSpec(&gPrefs.savedBinDefaultFolder, 
  368.             &gPrefs.savedBinDefaultFolderAlias, kICDownloadFolder);
  369.         ReadFontInfo(gPrefs.textFont, &gPrefs.textSize, kICScreenFont);
  370.         ReadFontInfo(gPrefs.printingFont, &gPrefs.printingSize, kICPrinterFont);
  371.         ReadURLHelperInfo(&gPrefs.ftpHelperInfo, kICftpHelper);
  372.         ReadURLHelperInfo(&gPrefs.httpHelperInfo, kIChttpHelper);
  373.         ReadURLHelperInfo(&gPrefs.gopherHelperInfo, kICgopherHelper);
  374.         ReadURLHelperInfo(&gPrefs.waisHelperInfo, kICwaisHelper);
  375.         ReadURLHelperInfo(&gPrefs.telnetHelperInfo, kICtelnetHelper);
  376.         ReadURLHelperInfo(&gPrefs.tn3270HelperInfo, kICtn3270Helper);
  377.         ReadURLHelperInfo(&gPrefs.fingerHelperInfo, kICfingerHelper);
  378.         ReadURLHelperInfo(&gPrefs.whoisHelperInfo, kICwhoisHelper);
  379.         ReadEditorInfo(&gPrefs.savedArtCreator);
  380.     } else if (EqualString(key, kICRealName, true, true)) {
  381.         ReadCStringFromPString(gPrefs.fullName, sizeof(gPrefs.fullName), 
  382.             kICRealName);
  383.     } else if (EqualString(key, kICOrganization, true, true)) {
  384.         ReadCStringFromPString(gPrefs.organization, sizeof(gPrefs.organization),
  385.             kICOrganization);
  386.     } else if (EqualString(key, kICQuotingString, true, true)) {
  387.         ReadCStringFromPString(gPrefs.quoteString, sizeof(gPrefs.quoteString),
  388.             kICQuotingString);
  389.     } else if (EqualString(key, kICSignature, true, true)) {
  390.         ReadCStringFromText(gPrefs.signature, sizeof(gPrefs.signature),
  391.             kICSignature);
  392.     } else if (EqualString(key, kICEmail, true, true)) {
  393.         ReadCStringFromPString(gPrefs.emailAddress, sizeof(gPrefs.emailAddress),
  394.             kICEmail);
  395.     } else if (EqualString(key, kICSMTPHost, true, true)) {
  396.         ReadPStringFromPString(gPrefs.mailServerName, sizeof(gPrefs.mailServerName),
  397.             kICSMTPHost);
  398.     } else if (EqualString(key, kICMailHeaders, true, true)) {
  399.         ReadCStringFromText(gPrefs.extraMailHdrLines, sizeof(gPrefs.extraMailHdrLines),
  400.             kICMailHeaders);
  401.     } else if (EqualString(key, kICNewsAuthUsername, true, true)) {
  402.         ReadCStringFromPString(gPrefs.authUsername, sizeof(gPrefs.authUsername),
  403.             kICNewsAuthUsername);
  404.     } else if (EqualString(key, kICNewsAuthPassword, true, true)) {
  405.         ReadCStringFromPString(gPrefs.authPassword, sizeof(gPrefs.authPassword),
  406.             kICNewsAuthPassword);
  407.     } else if (EqualString(key, kICNNTPHost, true, true)) {
  408.         ReadPStringFromPString(gPrefs.newsServerName, sizeof(gPrefs.newsServerName),
  409.             kICNNTPHost);
  410.     } else if (EqualString(key, kICNewsHeaders, true, true)) {
  411.         ReadCStringFromText(gPrefs.extraNewsHdrLines, sizeof(gPrefs.extraNewsHdrLines),
  412.             kICNewsHeaders);
  413.     } else if (EqualString(key, kICDownloadFolder, true, true)) {
  414.         ReadFolderFromFileSpec(&gPrefs.savedBinDefaultFolder, 
  415.             &gPrefs.savedBinDefaultFolderAlias, kICDownloadFolder);
  416.     } else if (EqualString(key, kICScreenFont, true, true)) {
  417.         ReadFontInfo(gPrefs.textFont, &gPrefs.textSize, kICScreenFont);
  418.     } else if (EqualString(key, kICPrinterFont, true, true)) {
  419.         ReadFontInfo(gPrefs.printingFont, &gPrefs.printingSize, kICPrinterFont);
  420.     } else if (EqualString(key, kICftpHelper, true, true)) {
  421.         ReadURLHelperInfo(&gPrefs.ftpHelperInfo, kICftpHelper);
  422.     } else if (EqualString(key, kIChttpHelper, true, true)) {
  423.         ReadURLHelperInfo(&gPrefs.httpHelperInfo, kIChttpHelper);
  424.     } else if (EqualString(key, kICgopherHelper, true, true)) {
  425.         ReadURLHelperInfo(&gPrefs.gopherHelperInfo, kICgopherHelper);
  426.     } else if (EqualString(key, kICwaisHelper, true, true)) {
  427.         ReadURLHelperInfo(&gPrefs.waisHelperInfo, kICwaisHelper);
  428.     } else if (EqualString(key, kICtelnetHelper, true, true)) {
  429.         ReadURLHelperInfo(&gPrefs.telnetHelperInfo, kICtelnetHelper);
  430.     } else if (EqualString(key, kICtn3270Helper, true, true)) {
  431.         ReadURLHelperInfo(&gPrefs.tn3270HelperInfo, kICtn3270Helper);
  432.     } else if (EqualString(key, kICfingerHelper, true, true)) {
  433.         ReadURLHelperInfo(&gPrefs.fingerHelperInfo, kICfingerHelper);
  434.     } else if (EqualString(key, kICwhoisHelper, true, true)) {
  435.         ReadURLHelperInfo(&gPrefs.whoisHelperInfo, kICwhoisHelper);
  436.     } else if (EqualString(key, kICeditorHelper, true, true)) {
  437.         ReadEditorInfo(&gPrefs.savedArtCreator);
  438.     }
  439.     
  440.     ICEnd(gInst);
  441. }
  442.  
  443.  
  444.  
  445. /*----------------------------------------------------------------------------
  446.     WriteCStringToPString 
  447.     
  448.     Write a C string shared pref to a P string IC pref.
  449.     
  450.     Entry:    theString = pointer to C string shared pref.
  451.             key = IC keyword.
  452. ----------------------------------------------------------------------------*/
  453.  
  454. static void WriteCStringToPString (char *theString, ConstStr255Param key)
  455. {
  456.     c2pstr(theString);
  457.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)theString, *theString+1); 
  458.     p2cstr((StringPtr)theString);
  459. }
  460.  
  461.  
  462.  
  463. /*----------------------------------------------------------------------------
  464.     WritePStringToPString 
  465.     
  466.     Write a P string shared pref to a P string IC pref.
  467.     
  468.     Entry:    theString = pointer to P string shared pref.
  469.             key = IC keyword.
  470. ----------------------------------------------------------------------------*/
  471.  
  472. static void WritePStringToPString (StringPtr theString, ConstStr255Param key)
  473. {
  474.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)theString, *theString+1); 
  475. }
  476.  
  477.  
  478.  
  479. /*----------------------------------------------------------------------------
  480.     WriteCStringToText 
  481.     
  482.     Write a C string shared pref to a text IC pref.
  483.     
  484.     Entry:    theString = pointer to C string shared pref.
  485.             key = IC keyword.
  486. ----------------------------------------------------------------------------*/
  487.  
  488. static void WriteCStringToText (char *theString, ConstStr255Param key)
  489. {
  490.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)theString, strlen(theString));
  491. }
  492.  
  493.  
  494.  
  495. /*----------------------------------------------------------------------------
  496.     WriteFolderToFileSpec 
  497.     
  498.     Write a default folder shared pref to an ICFileSpec IC pref.
  499.     
  500.     Entry:    defaultFolder = Boolean pref for default folder.
  501.             defaultFolderAlias = Handle to alias for default folder
  502.             key = IC keyword.
  503. ----------------------------------------------------------------------------*/
  504.  
  505. static void WriteFolderToFileSpec (Boolean defaultFolder, 
  506.     AliasHandle defaultFolderAlias, 
  507.     ConstStr255Param key)
  508. {
  509.     char buf[4096];
  510.     OSErr err = noErr;
  511.     ICFileSpec *p;
  512.     HParamBlockRec pb;
  513.     Str31 volName;
  514.     long aliasSize, size;
  515.     FSSpec fss;
  516.     Boolean wasChanged;
  517.     
  518.     if (!defaultFolder) return;
  519.     if (defaultFolderAlias == nil) return;
  520.     err = ResolveAlias(nil, defaultFolderAlias, &fss, &wasChanged); 
  521.     if (err != noErr) return;
  522.     pb.volumeParam.ioNamePtr = volName;
  523.     pb.volumeParam.ioVolIndex = 0;
  524.     pb.volumeParam.ioVRefNum = fss.vRefNum;
  525.     err = PBHGetVInfoSync(&pb);
  526.     p = (ICFileSpec*)buf;
  527.     CopyPascalString(p->vol_name, volName);
  528.     p->vol_creation_date = pb.volumeParam.ioVCrDate;
  529.     p->fss = fss;
  530.     aliasSize = (**defaultFolderAlias).aliasSize;
  531.     size = aliasSize + sizeof(Str31) + sizeof(long) + sizeof(FSSpec);
  532.     if (size > sizeof(buf)) return;
  533.     BlockMoveData(*defaultFolderAlias, &p->alias, aliasSize);
  534.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)buf, size);
  535. }
  536.  
  537.  
  538.  
  539. /*----------------------------------------------------------------------------
  540.     WriteFontInfo 
  541.     
  542.     Read font info to an ICFontRecord IC pref.
  543.     
  544.     Entry:    fontName = font name.
  545.             fontSize = font size.
  546.             key = IC keyword.
  547. ----------------------------------------------------------------------------*/
  548.  
  549. static void WriteFontInfo (Str255 fontName, short fontSize, 
  550.     ConstStr255Param key)
  551. {
  552.     ICError icErr;
  553.     ICFontRecord icFontRecord;
  554.     ICAttr attr;
  555.     long size;
  556.  
  557.     size = sizeof(icFontRecord);
  558.     icErr = MyICGetPref(gInst, key, &attr, (Ptr)&icFontRecord, &size);
  559.     if (icErr == icPrefNotFoundErr) {
  560.         icFontRecord.face = normal;
  561.     } else if (icErr != noErr) {
  562.         return;
  563.     }
  564.     CopyPascalString(icFontRecord.font, fontName);
  565.     icFontRecord.size = fontSize;
  566.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)&icFontRecord, size);
  567. }
  568.  
  569.  
  570.  
  571. /*----------------------------------------------------------------------------
  572.     WriteURLHelperInfo 
  573.     
  574.     Write URL Helper info to an ICAppSpec IC pref.
  575.     
  576.     Entry:    helperInfo = pointer to helper info.
  577.             key = IC keyword.
  578. ----------------------------------------------------------------------------*/
  579.  
  580. static void WriteURLHelperInfo (TURLHelperInfo *helperInfo, ConstStr255Param key)
  581. {
  582.     ICAppSpec icAppSpec;
  583.     long size;
  584.     OSErr err = noErr;
  585.     
  586.     icAppSpec.fCreator = helperInfo->sig;
  587.     err = FindAppNameFromSig(icAppSpec.fCreator, icAppSpec.name);
  588.     if (err != noErr) *icAppSpec.name = 0;
  589.     size = sizeof(icAppSpec);
  590.     MyICSetPref(gInst, key, ICattr_no_change, (Ptr)&icAppSpec, size);
  591. }
  592.  
  593.  
  594.  
  595. /*----------------------------------------------------------------------------
  596.     WriteEditorInfo 
  597.     
  598.     Write Editor info to the "editor" helper ICAppSpec IC pref.
  599.     
  600.     Entry:    sig = editor helper signature.
  601. ----------------------------------------------------------------------------*/
  602.  
  603. static void WriteEditorInfo (OSType sig)
  604. {
  605.     ICAppSpec icAppSpec;
  606.     long size;
  607.     OSErr err = noErr;
  608.     
  609.     icAppSpec.fCreator = sig;
  610.     err = FindAppNameFromSig(sig, icAppSpec.name);
  611.     if (err != noErr) *icAppSpec.name = 0;
  612.     size = sizeof(icAppSpec);
  613.     MyICSetPref(gInst, kICeditorHelper, ICattr_no_change, (Ptr)&icAppSpec, size);
  614. }
  615.  
  616.  
  617.  
  618. /*----------------------------------------------------------------------------
  619.     MyICWriteSharedPrefs 
  620.     
  621.     Write shared Internet Config prefs.
  622.     
  623.     Entry:    key = IC keyword for shared pref.
  624. ----------------------------------------------------------------------------*/
  625.  
  626. void MyICWriteSharedPrefs (ConstStr255Param key)
  627. {
  628.     ICError icErr;
  629.  
  630.     if (!gICStartOK) return;
  631.     
  632.     icErr = ICBegin(gInst, icReadWritePerm);
  633.     if (icErr != noErr) return;
  634.     
  635.     if (EqualString(key, kICAllSharedPrefs, true, true)) {
  636.         WriteCStringToPString(gPrefs.fullName, kICRealName);
  637.         WriteCStringToPString(gPrefs.organization, kICOrganization);
  638.         WriteCStringToPString(gPrefs.quoteString, kICQuotingString);
  639.         WriteCStringToText(gPrefs.signature, kICSignature);
  640.         WriteCStringToPString(gPrefs.emailAddress, kICEmail);
  641.         WritePStringToPString(gPrefs.mailServerName, kICSMTPHost);
  642.         WriteCStringToText(gPrefs.extraMailHdrLines, kICMailHeaders);
  643.         WriteCStringToPString(gPrefs.authUsername, kICNewsAuthUsername);
  644.         WriteCStringToPString(gPrefs.authPassword, kICNewsAuthPassword);
  645.         WritePStringToPString(gPrefs.newsServerName, kICNNTPHost);
  646.         WriteCStringToText(gPrefs.extraNewsHdrLines, kICNewsHeaders);
  647.         WriteFolderToFileSpec(gPrefs.savedBinDefaultFolder,
  648.             gPrefs.savedBinDefaultFolderAlias, kICDownloadFolder); 
  649.         WriteFontInfo(gPrefs.textFont, gPrefs.textSize, kICScreenFont);
  650.         WriteFontInfo(gPrefs.printingFont, gPrefs.printingSize, kICPrinterFont);
  651.         WriteURLHelperInfo(&gPrefs.ftpHelperInfo, kICftpHelper);
  652.         WriteURLHelperInfo(&gPrefs.httpHelperInfo, kIChttpHelper);
  653.         WriteURLHelperInfo(&gPrefs.gopherHelperInfo, kICgopherHelper);
  654.         WriteURLHelperInfo(&gPrefs.waisHelperInfo, kICwaisHelper);
  655.         WriteURLHelperInfo(&gPrefs.telnetHelperInfo, kICtelnetHelper);
  656.         WriteURLHelperInfo(&gPrefs.tn3270HelperInfo, kICtn3270Helper);
  657.         WriteURLHelperInfo(&gPrefs.fingerHelperInfo, kICfingerHelper);
  658.         WriteURLHelperInfo(&gPrefs.whoisHelperInfo, kICwhoisHelper);
  659.         WriteEditorInfo(gPrefs.savedArtCreator);
  660.     } else if (EqualString(key, kICRealName, true, true)) {
  661.         WriteCStringToPString(gPrefs.fullName, kICRealName);
  662.     } else if (EqualString(key, kICOrganization, true, true)) {
  663.         WriteCStringToPString(gPrefs.organization, kICOrganization);
  664.     } else if (EqualString(key, kICQuotingString, true, true)) {
  665.         WriteCStringToPString(gPrefs.quoteString, kICQuotingString);
  666.     } else if (EqualString(key, kICSignature, true, true)) {
  667.         WriteCStringToText(gPrefs.signature, kICSignature);
  668.     } else if (EqualString(key, kICEmail, true, true)) {
  669.         WriteCStringToPString(gPrefs.emailAddress, kICEmail);
  670.     } else if (EqualString(key, kICSMTPHost, true, true)) {
  671.         WritePStringToPString(gPrefs.mailServerName, kICSMTPHost);
  672.     } else if (EqualString(key, kICMailHeaders, true, true)) {
  673.         WriteCStringToText(gPrefs.extraMailHdrLines, kICMailHeaders);
  674.     } else if (EqualString(key, kICNewsAuthUsername, true, true)) {
  675.         WriteCStringToPString(gPrefs.authUsername, kICNewsAuthUsername);
  676.     } else if (EqualString(key, kICNewsAuthPassword, true, true)) {
  677.         WriteCStringToPString(gPrefs.authPassword, kICNewsAuthPassword);
  678.     } else if (EqualString(key, kICNNTPHost, true, true)) {
  679.         WritePStringToPString(gPrefs.newsServerName, kICNNTPHost);
  680.     } else if (EqualString(key, kICNewsHeaders, true, true)) {
  681.         WriteCStringToText(gPrefs.extraNewsHdrLines, kICNewsHeaders);
  682.     } else if (EqualString(key, kICDownloadFolder, true, true)) {
  683.         WriteFolderToFileSpec(gPrefs.savedBinDefaultFolder,
  684.             gPrefs.savedBinDefaultFolderAlias, kICDownloadFolder); 
  685.     } else if (EqualString(key, kICScreenFont, true, true)) {
  686.         WriteFontInfo(gPrefs.textFont, gPrefs.textSize, kICScreenFont);
  687.     } else if (EqualString(key, kICPrinterFont, true, true)) {
  688.         WriteFontInfo(gPrefs.printingFont, gPrefs.printingSize, kICPrinterFont);
  689.     } else if (EqualString(key, kICftpHelper, true, true)) {
  690.         WriteURLHelperInfo(&gPrefs.ftpHelperInfo, kICftpHelper);
  691.     } else if (EqualString(key, kIChttpHelper, true, true)) {
  692.         WriteURLHelperInfo(&gPrefs.httpHelperInfo, kIChttpHelper);
  693.     } else if (EqualString(key, kICgopherHelper, true, true)) {
  694.         WriteURLHelperInfo(&gPrefs.gopherHelperInfo, kICgopherHelper);
  695.     } else if (EqualString(key, kICwaisHelper, true, true)) {
  696.         WriteURLHelperInfo(&gPrefs.waisHelperInfo, kICwaisHelper);
  697.     } else if (EqualString(key, kICtelnetHelper, true, true)) {
  698.         WriteURLHelperInfo(&gPrefs.telnetHelperInfo, kICtelnetHelper);
  699.     } else if (EqualString(key, kICtn3270Helper, true, true)) {
  700.         WriteURLHelperInfo(&gPrefs.tn3270HelperInfo, kICtn3270Helper);
  701.     } else if (EqualString(key, kICfingerHelper, true, true)) {
  702.         WriteURLHelperInfo(&gPrefs.fingerHelperInfo, kICfingerHelper);
  703.     } else if (EqualString(key, kICwhoisHelper, true, true)) {
  704.         WriteURLHelperInfo(&gPrefs.whoisHelperInfo, kICwhoisHelper);
  705.     } else if (EqualString(key, kICeditorHelper, true, true)) {
  706.         WriteEditorInfo(gPrefs.savedArtCreator);
  707.     }
  708.     
  709.     ICEnd(gInst);
  710. }
  711.